
----------------------------------------------------------------
--- Copyright：  迷你玩-海马
--- Description：配置中心服务器
----------------------------------------------------------------

------ 两大功能：
---- 1 管理所有配置文件的分发
-------- 1.1  PHP服务器向本服务器通知: 有【lua配置文件】被运维修改
-------- 1.2  本服务器通过rsync向php服务器目录同步所有【lua配置文件】
-------- 1.3  其他业务服务器向本级查询所关心的配置文件的md5是否变化 ( 例子在 luaConfigProxy.lua )
-------- 1.4  如果文件有变化，则向本机器拉取对应的【lua配置文件】


---- 2 管理部分worker的上报 ( 目前还未启用 )
-------- 云租赁服在 rent_server 中集成了类似功能
-------- 一个 rent_server 控制多个 keeper_server

----------------------------------------------------------------


local require = require;
local ngx     = ngx;
local pairs   = pairs;
local string  = string;
local collectgarbage = collectgarbage;
local table = table;
local io = io;
local assert = assert;
local tonumber = tonumber;

local log          = require("modules.commhm.log")
local ns_time      = require("modules.commhm.time")
local uu           = require("modules.commhm.utils")
local ns_env       = require("modules.env.env")

local ns_auth_comm_checker    = require("modules.commhm.auth_comm_checker");

local gg                      = require("modules.center_server.center_gg")
local ns_configMgr            = require("modules.center_server.configMgr")
local ns_luaConfigMgr         = require("modules.center_server.luaConfigProxy")

local ns_routeMgr = require( "modules.center_server.routeMgr" )


local FOO = {
	_VERSION = '0.12.1',
	acts = {},
	cmds = {},
};


-- 不验证
FOO.read_no_auth_acts = {
	-- fatalReport = 1,
	getFatalReport = 1,
}


---php ctoken 模式验证
FOO.ctoken = {
	getKeeperList = 1,
	getKeeperDetail = 1,
}


FOO.enter = function()

	ngx.ctx.m_params = ngx.req.get_uri_args();

	ngx.ctx.log = tonumber(ngx.ctx.m_params.log) or 0
	if  ngx.ctx.log == 1 and (ns_env.debug == 0 or ns_env.debug == 10) then
		-- 增强正式环境log=1的安全性 ( log_safe=yxh (永新汇) )
		if  not (ngx.ctx.m_params.log_safe == 'yxh') then
			log.debug( 'log_debug_ignored' )
			ngx.ctx.log = 0  --不显示debug日志
		end
	end

	if  ngx.ctx.m_params.cmd then
		--log.debug( "----enter---- cmd=" .. ngx.ctx.m_params.cmd );
		local func_ = FOO.cmds[ ngx.ctx.m_params.cmd ];
		if  func_ then
			if  FOO.read_no_auth_acts[ ngx.ctx.m_params.cmd ] == 1 then
				if  not ns_auth_comm_checker.check_uin_safe( ngx.ctx.m_params.uin ) then
					return
				end
			elseif FOO.ctoken[ngx.ctx.m_params.cmd] == 1 then
				local ret_, user_ = ns_auth_comm_checker.check_ctoken( ngx.ctx.m_params.ctoken )
				if  ret_ then
					ngx.ctx.m_params.gm_name = user_
					log.debug( "ctoken ok" )
				else
					log.debug( "ctoken error" )
					return
				end
			else
				if  ns_auth_comm_checker.check_cmd_auth_no_exit() ~= 0 then
					return
				end
			end

			--gg.init();
			func_();
			--gg.final();

		else
			log.debug( "unknown cmd=" .. ngx.ctx.m_params.cmd );
		end

	elseif ngx.ctx.m_params.act then
		log.debug( "act error" );
	elseif ngx.ctx.m_params.try_init_worker then
		log.day_list( "server_init", "center_server", ngx.worker.id(), "try_init_worker" )
	else
		log.debug( "no act or cmd need to do" );
	end

end



--构造函数
FOO.init = function()
	gg.init()
	log.day_list( "center_server", ngx.worker.id(), "init" )

	ns_configMgr.worker_checkLuaConfigChanged()
	gg.timer_every( 60 + ngx.worker.id(), ns_configMgr.worker_checkLuaConfigChanged )

	ns_luaConfigMgr.register_config_file_change( "servers_update", 120, gg.cb_refresh_servers_update, "center_server" )
end


---132通知center，去132同步所有的配置文件
FOO.cmds.infoNeedRsyncLuaConfigFiles = function()
	ns_configMgr.infoNeedRsyncLuaConfigFiles()
end


---获得某个配置文件的下载地址和md5值 (主要接口)
FOO.cmds.getLuaConfigFileInfo = function()
	ns_configMgr.getLuaConfigFileInfo()
end


---上报指定的统计值，目前在用 ma_gate dc_gate data_cache
FOO.cmds.reportLoad = function()
	gg.reportLoad()
end

---获得指定的上报值
FOO.cmds.getLoadByName = function()
	gg.getLoadByName()
end


--- 通用上报接口，目前主要给data_cache使用
FOO.cmds.reportDataComm = function()
	gg.reportDataComm()
end


----------------------------------路由注册和取消注册接口-------------
FOO.cmds.register_route = function()
	ns_routeMgr.register_route()
end

-- 查询一个路由
FOO.cmds.get_route = function()
	ns_routeMgr.get_route()
end

-- 按path清理一个路由
FOO.cmds.clean_route = function()
	ns_routeMgr.clean_route()
end


-----------------------------------------------------------------
--- 下面是两个测试的例子
-----------------------------------------------------------------

---测试获得远程配置文件
FOO.cmds.test_getRemoteLuaConfig = function()
	---local ns_luaConfigMgr = require("modules.center_server.luaConfigProxy")
	ns_luaConfigMgr.register_config_file_change( "version", 30, FOO.test_callback_fresh_config, "center_test" )
end

----上面的配套回调函数
function FOO.test_callback_fresh_config( config_file_content_ )
	log.debug( "call test_fresh_config" )
	local config_ = table.loadstring( config_file_content_, true )
	uu.var_dump( config_ )
end


----========================keeper_list===========
function FOO.cmds.getKeeperList()
	ns_configMgr.getKeeperList()
end


function FOO.cmds.getKeeperDetail()
	ns_configMgr.getKeeperDetail()
end


function FOO.cmds.sendKeeperMsg()
	ns_configMgr.sendKeeperMsg()
end


-- 132服务器上报服务器IP和名字对应表
function FOO.cmds.reportServerIpName()
	ns_configMgr.reportServerIpName()
end


-- 显示dc详情列表
function FOO.cmds.showDcList()
	ns_configMgr.showDcList()
end


-- 显示ma_gate详情列表
function FOO.cmds.showMaGateList()
	ns_configMgr.showMaGateList()
end


----========================fate_report===========


-- 关键事件或严重错误上报
function FOO.cmds.fatalReport()

	-- level    严重程度  0fatal > 1error > 2warn > 3info
	-- env      环境
	-- key      唯一排重key
	-- tt       时间间隔   ( n秒内被排重掉 )
	-- value    字符串( post里 )
	-- ip       需要按ip统计

	ngx.req.read_body();
	local post_value_ = ngx.req.get_body_data();

	local ret_ = gg.write_fatalReport( ngx.ctx.m_params, post_value_ )
	ngx.say( ret_ )
end




-- 拉取日志
function FOO.cmds.getFatalReport()
	-- level    严重程度  0fatal > 1error > 2warn > 3info
	-- env      环境
	-- day      0=今天  1=昨天  2=前天

	local args_ = ngx.ctx.m_params
	if  not ( args_.env ) then
		log.day_list( 'rp', 'error_params', uu.to_str( args_ ) )
		ngx.say( 'error_params' )
		return
	end


	local day_ = 0
	if  args_.day then
		day_ = tonumber( args_.day ) or 0
	end

	local limit_ = 100
	if  args_.limit then
		limit_ = tonumber( args_.limit ) or 100
	end

	-- tail 结果
	local final_ret_ = {}
	for env_=0, 3, 1 do
		final_ret_[ #final_ret_ + 1 ] = '==========================';
		local day_str_ = ns_time.getDay( 0 - day_ )
		local file_name_ = 'logs/miniw/' .. table.concat( { 'rp', 'e'..args_.env, env_, day_str_ }, '_' ) .. '.log'
		if  uu.file_exist( file_name_ ) then
			final_ret_[ #final_ret_ + 1 ] = 'file_exist: ' .. file_name_;
			local ret = uu.os_exec_async( "tail -n " .. limit_ .. ' ' ..  file_name_ )
			local t_ = uu.split( ret, '\n' )
			for i=1, #t_ do
				final_ret_[ #final_ret_ + 1 ] = t_[i];
			end
		else
			final_ret_[ #final_ret_ + 1 ] = 'file_not_exist: ' .. file_name_;
		end
	end

	ngx.say( table.concat( final_ret_, "<br>\n" ) );
end


FOO.init()
return FOO;
